﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

/*
    Socket1项目，主要弄清楚socket的初始化及怎样发送消息、接受消息
*/
namespace Socket1.Server
{
    class Program
    {
        static void Main(string[] args)
        {
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            #region 端口
            //端口号的范围从0到65535，建议自己写程序设置端口，都大于3000小于65535，
            //因为windows很多默认程序都小于3000，这样可以避免不必要的端口冲突。
            #endregion
            IPEndPoint ipe = new IPEndPoint(ip, 5001);
            //1.建立一个Socket对象
            Socket socketServer = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);
            //2.Socket关联到这个IP上面
            socketServer.Bind(ipe);
            #region 3.开始监听这个IP是否有客户端连接
            //Listen参数：同时有多台客户端连接服务器时，最多允许排队等待的客户端数量
            #endregion
            //最多允许8个客户端排队等待（这个数值建议小于30）
            socketServer.Listen(8);
            Console.WriteLine("正在监听...");
            //接收发送连接信息的客户端(一直等待客户端连接，不继续执行)
            Socket acceptSocket = socketServer.Accept();
            Console.WriteLine("连接成功！！");
            string message = string.Empty;
            byte[] receiveBytes = new byte[2048];
            //服务端会一直等待客户端发送消息，否则不继续执行
            int byteLen = acceptSocket.Receive(receiveBytes, receiveBytes.Length, 0);
            message += Encoding.UTF8.GetString(receiveBytes, 0, byteLen);
            Console.WriteLine("客户端消息：" + message);
            //发送消息给客户端
            string sendMessage = "Hi Boy,I am SocketServer!";
            byte[] sendBytes = Encoding.UTF8.GetBytes(sendMessage);
            acceptSocket.Send(sendBytes, sendBytes.Length, 0);
            //释放Socket占用的资源
            acceptSocket.Dispose();
            socketServer.Dispose();
            Console.ReadKey();
        }
    }
}
